ABOT / neo-ABOT XBee Remote Control GUIDE

neo-ABOT/ABOT 무선 원격제어 실습안내서

[ XBee 무선통신 / WiFi 무선통신 ]

1. neo-ABOT/ABOT 무선 원격제어 실습 소개

여러분은 지금부터 엑스비(XBee) 무선통신 수단을 사용하여 ABOT 또는 neo-ABOT을 원격제어할 수 있는 실습을 해볼 것이다. 두 개의 서로 다른 ABOT에 엑스비 무선통신 기능을 추가하기 위해서는 서로 다른 하드웨어 구성품이 필요하다.

아래 표에서는 ABOT/neo-ABOT 과는 별도로 추가되어야 할 하드웨어 구성품들을 각각 나타내었다.

	neo-ABOT	ABOT
PC연결용 통신부품(공통)	XBee wireless Antenna (802.15.4) USB Explorer Dongle
로봇 설치용 통신부품	XBee wireless Antenna (802.15.4)	XBee wireless Antenna (802.15.4) 엑스비 SIP 어댑터
유튜브 동영상주소	http://youtu.be/_WAMmpjqGuI	http://youtu.be/vESmcCxcJcY

다음 단계로 하드웨어 장치를 동작시키기 위한 스케치는 두 개의 ABOT 모두에서 동일하게 적용된다. 로봇카의 무선통신 원격제어는 (1) PC ↔ 로봇카 사이를 무선통신하는 Xbee 무선통신 방법 그리고 (2) 안드로이드 스마트폰 ↔ PC 사이를 와이파이(WiFi) 무선통신하는 방법으로 나누어 설명한다.

Tel: 0505-305-8000 Fax: 0505-380-8800 E-mail: mail@fribot.com WebSite: www.fribot.com

주소: [780-775] 경북 경주시 안강읍 구부랑길 73 안강우방타운 102동 203호

2. Xbee 무선통신을 위한 하드웨어 사용법

2.1 neo-ABOT 하드웨어 설치 및 사용법

neo-ABOT 상부의 슬롯에 Xbee 안테나를 끼우면 엑스비 무선통신을 위한 설치가 완료된다. neo-ABOT의 유선 시리얼 통신은 USB케이블을 통하여 PC와 연결될 수 있고, 무선 시리얼 통신은 엑스비(XBee) 안테나를 통하여 PC와 연결될 수 있다. 두 개의 유선/무선 시리얼통신을 함께 사용할 수는 없으며, 여러분은 아두이노비 BOE 쉴드 보드의 시리얼 통신 선택스위치를 사용하여 두 개중 하나를 선택하여 사용하여야 한다.

USB유선 시리얼

XBee무선 시리얼

USB유선 시리얼통신의 용도는 PC의 아두이노 프로그램을 이용하여 작성된 스케치를 neo-ABOT으로 업로드하기 위하여 사용한다. 유선 시리얼통신 작업은 엑스비 무선 시리얼통신으로는 가능하지 않게 설정되어 있다.

XBee무선 시리얼통신의 용도는 neo-ABOT을 무선 데이터통신으로 원격제어하려고 할 때 사용된다. 따라서 여러분은 두 개의 시리얼통신을 혼동하지 않고 용도에 맞게 실습을 진행하기 바란다.

2.2 ABOT 하드웨어 설치 및 사용법

엑스비 SIP어댑터의 슬롯에 엑스비 안테나를 끼우고, 다음 단계로 ABOT의 브래드보드에 엑스비 SIP어댑터를 끼우자. 다음 단계에서 SIP어댑터의 +5V전원과 접지(GND)단자를 ABOT의 +5V전원과 접지로 점프와이어를 이용하여 각각 연결한다. 그리고 XBee무선 시리얼통신을 위하여 소프트웨어 시리얼 연결방법에 대하여 설명할 것이다.

유선/무선 시리얼통신은 Tx포트와 Rx포트로 구성된다. 여러분은 SIP어댑터의 DOUT핀을 아두이노의 D10번 핀에 연결하고, DIN핀을 D11번 핀으로 그림과 같이 연결한다. 다음 단계에서 시리얼통신 소프트웨어 설정을 통하여 D10번을 RX로, D11번을 TX로 할당하여 엑스비 시리얼통신을 시도할 것이다.

(ABOT에서는 neo-ABOT의 시리얼통신 선택 스위치가 별도로 존재하지 않으므로 여러분은 무시해도 좋다.)

3. Xbee무선 데이터통신 실습

3.1 neo-ABOT 무선 원격제어

neo-ABOT에 USB케이블을 연결하고, 하드웨어 시리얼 선택스위치가 정상적인 위치에 있는지 확인한 후 다음의 스케치를 아두이노 프로그램을 사용하여 neo-ABOT에 업로드 해보자. 이때 3접점 스위치는 중립상태 또는 서보모터 오프(OFF)상태에 두는 것이 좋다.

#include <Servo.h>

Servo servoLeft;

Servo servoRight;

void setup()                    // run once, when the sketch starts

{

Serial.begin(9600);

servoLeft.attach(13); // Attach left signal to pin 13

servoRight.attach(12); // Attach right signal to pin 12

maneuver(0,0,100);

}

void loop()                     // run over and over again

{

if ( Serial.available() > 0 ){

char key = Serial.read();

if (key == 't')

{

maneuver(200,200,500);

maneuver(0,0,10);

}

if (key == 'f')

{

maneuver(-200,200,500);

maneuver(0,0,10);

}

if (key == 'g')

{

maneuver(200,-200,500);

maneuver(0,0,10);

}

if (key == 'v')

{

maneuver(-200,-200,500);

maneuver(0,0,10);

}

if (key == 's')

{

maneuver(0,0,500);

}

}

}

void maneuver(int speedLeft, int speedRight, int msTime)

{

servoLeft.writeMicroseconds(1500 + speedLeft);	//왼쪽 서보 속도 설정

servoRight.writeMicroseconds(1500 - speedRight);	//오른쪽 서보 속도 설정

if(msTime==-1) // if msTime = -1

{

servoLeft.detach(); // Stop servo signals

servoRight.detach();

}

delay(msTime); // Delay for msTime

}

다음 단계에서 Processing 프로그램을 열고, 아래 스케치를 입력한 후 RUN시킨다.

import processing.serial.*;

Serial myPort;  // Create object from Serial class

void setup()

{

myPort = new Serial(this, Serial.list()[0], 9600);

}

void draw(){}

void keyPressed()

{

if( key == 't' ) myPort.write( 't' );

if( key == 'f' ) myPort.write( 'f' );

if( key == 'g' ) myPort.write( 'g' );

if( key == 'v' ) myPort.write( 'v' );

if( key == 's' ) myPort.write( 's' );

}

위의 과정을 모두 성공적으로 마쳤다면, 여러분의 키보드에서 't' 'f' 'g' 'v' 's' 문자를 각각 입력하고 neo-ABOT의 주행동작이 정상적인지를 살펴보자. 이때, neo-ABOT에 USB케이블이 연결되어 있기 때문에 주행동작에 제한을 받을 수 있다는 점을 유의하자.

여러분의 neo-ABOT이 USB 유선 케이블로 전송되는 키보드 데이터에 따라 주행동작이 각각 다르게 잘 표현되는가? 만약 그렇다면 여러분은 이제 간단히 엑스비 통신 부품을 설치하는 것으로 엑스비 무선 원격제어를 실행할 수 있을 것이다.

이제, USB케이블을 neo-ABOT에서 분리하고, neo-ABOT에 배터리 전원이 연결되어 있지 않다면 전원을 연결하도록 하자. 다음에 neo-ABOT의 엑스비 안테나 슬롯에 엑스비 안테나를 설치하고, 시리얼통신 선택스위치의 방향을 “Xbee무선 시리얼” 상태로 변경한다.

다음 단계로 여러분의 엑스비 USB Explorer 부품에 엑스비 안테나를 결합하고 PC의 USB포트에 연결한다. 이제 엑스비 무선통신에 의한 ABOT 무선 원격제어 준비가 끝났다.

여러분의 neo-ABOT 3접점 스위치를 변경하여, ABOT의 서보모터에 전원이 공급될 수 있도록 해보자.

여러분의 키보드에서 't' 'f' 'g' 'v' 's' 문자를 각각 입력하고 neo-ABOT의 주행동작이 정상적인지를 살펴보자. 무선 상태에서도 잘 동작하는가? 만약 그렇다면 여러분의 과정이 성공한 것이다. 여러분의 성공을 축하한다.

한가지만 더 무선으로 데이터 통신하는 방법을 시도해보자. 이전에 사용했던 프로세싱 프로그램을 닫고, X-CTU 터미널을 켜보자. 그리고 X-CTU 터미널에서 키보드의 't' 'f' 'g' 'v' 's' 문자를 각각 입력해보자. 이전까지와 동일하게 neo-ABOT의 주행동작이 무선상태에서 정상적으로 동작하는가? X-CTU는 Xbee 안테나 사용자를 위하여 Digi사에서 무료로 제공하는 터미널 도구이다.

3.2 ABOT 무선 원격제어

ABOT에 USB케이블을 연결하고, 다음의 스케치를 아두이노 프로그램을 사용하여 ABOT에 업로드 해보자.

#include <Servo.h>

#include <SoftwareSerial.h>

Servo servoLeft;

Servo servoRight;

SoftwareSerial mySerial(10, 11); // RX, TX

void setup()                    // run once, when the sketch starts

{

mySerial.begin(9600);

servoLeft.attach(13); // Attach left signal to pin 13

servoRight.attach(12); // Attach right signal to pin 12

maneuver(0,0,100);

}

void loop()                     // run over and over again

{

if ( mySerial.available() > 0 ){

char key = mySerial.read();

if (key == 't')

{

maneuver(200,200,500);

maneuver(0,0,10);

}

if (key == 'f')

{

maneuver(-200,200,500);

maneuver(0,0,10);

}

if (key == 'g')

{

maneuver(200,-200,500);

maneuver(0,0,10);

}

if (key == 'v')

{

maneuver(-200,-200,500);

maneuver(0,0,10);

}

if (key == 's')

{

maneuver(0,0,500);

}

}

}

void maneuver(int speedLeft, int speedRight, int msTime)

{

servoLeft.writeMicroseconds(1500 + speedLeft);	//왼쪽 서보 속도 설정

servoRight.writeMicroseconds(1500 - speedRight);	//오른쪽 서보 속도 설정

if(msTime==-1) // if msTime = -1

{

servoLeft.detach(); // Stop servo signals

servoRight.detach();

}

delay(msTime); // Delay for msTime

}

다음 단계에서 ABOT과 연결된 USB케이블을 제거하고, Processing 프로그램을 열어서 아래 스케치를 입력한 후 RUN시킨다.

import processing.serial.*;

Serial myPort;  // Create object from Serial class

void setup()

{

myPort = new Serial(this, Serial.list()[0], 9600);

}

void draw(){}

void keyPressed()

{

if( key == 't' ) myPort.write( 't' );

if( key == 'f' ) myPort.write( 'f' );

if( key == 'g' ) myPort.write( 'g' );

if( key == 'v' ) myPort.write( 'v' );

if( key == 's' ) myPort.write( 's' );

}

자! 여러분의 ABOT과 PC가 엑스비 무선통신을 할 수 있도록 여러분의 PC USB포트에 엑스비 Explorer Dongle을 설치한다.

여러분의 키보드에서 't' 'f' 'g' 'v' 's' 문자를 각각 입력하면 ABOT의 주행동작이 정상적으로 이루어지고 있는가? 만약 그렇다면 여러분의 실습이 성공한 것이다. 여러분은 ABOT의 무선 동작제어를 위해 더 많은 다양한 명령어들과 작동방식들을 사용할 수도 있을 것이다.

또 다른 엑스비통신 수단으로 여러분은 프로세싱 통신수단 이외에 X-CTU터미널을 사용하여 동일한 동작제어 명령을 전달할 수 있을 것이다. 이전에 사용했던 프로세싱 프로그램을 닫고, X-CTU 터미널을 켜서, 키보드의 't' 'f' 'g' 'v' 's' 문자를 각각 입력해 보자. 여러분의 ABOT이 잘 제어되는가?

4. 안드로이드 스마트폰을 이용한 와이파이(WiFi) 무선 데이터통신 실습

지금까지의 실습에 의해 PC가 엑스비 무선통신 수단을 이용하여 여러분의 로봇카를 원격제어할 수 있다는 것을 알았다. 그리고 여러분의 PC는 안드로이드 스마트폰과도 와이파이(WiFi) 무선통신이 가능하다는 것을 알고 있을 것이다. 물론 아이폰도 여러분의 PC와 와이파이 통신을 할 수 있다.

여러분의 스마트폰이 와이파이 통신을 이용하여 PC의 키보드 데이터를 전송할 수 있으면, 로봇카를 원격제어할 수 있을 것이다.

스마트폰으로 ABOT/neo-ABOT을 동작시키는데 필요한 프로그램을 동작시키는 일련의 과정은 ABOT/neo-ABOT 로봇카 실습 안내서의 범위를 벗어나므로 간단히 설명할 것이다. 그리고 안드로이드 스마트폰으로 로봇카를 원격제어하기 위해서는 안드로이드 스마트폰 개발자 환경을 여러분의 PC에 구축해야 한다. 개발자 환경을 구축하는 것은 공개 소프트웨어이기 때문에 온라인에서 쉽게 접근하여 설치할 수 있지만, 설치환경을 구축하는데 꽤 많은 시간이 소요될 것이다.

지금부터 소개하는 스마트폰 원격제어 자료들은 ABOT/neo-ABOT 모두에 공통으로 적용될 수 있다.

여기서는 스마트폰에서 숫자 1을 보내면 오른쪽으로 회전하고, 숫자 2를 보내면 왼쪽으로 회전하는 로봇카 원격제어 스케치를 소개한다. 여러분의 원격제어 용도에 맞지 않으면 수정하도록 한다.

4.1 프로세싱 스케치 수정하기

먼저 여러분의 프로세싱 스케치를 다음과 수정한다. 아래 프로세싱 스케치는 네트워크에서 데이터를 읽고, 그 값이 1이면 'r'을 시리얼 포트로 보내고 2이면 'l'을 시리얼 포트로 보낼 수 있다.

import processing.net.*;

import processing.serial.*; //추가

Serial myPort;  // Create object from Serial class

Server s; //추가

Client c; //추가

void setup()

{

size(200, 200);

String portName = Serial.list()[0]; //0 또는 1 시리얼 개수에 따라

myPort = new Serial(this, portName, 9600);

s = new Server(this, 12345);   // Start a simple server on a port //추가

PFont font;                     // 추가

font = createFont("굴림", 160);  // 추가

textFont(font);                  // 추가

}

void draw(){

// Receive data from client

c = s.available();

if (c != null) {

background(128);

//input = c.readString();

c.read(); // 한바이트를 미리 읽음 '0' 값

int n = c.read();

println(n);

text(n, 20,180);

if(n==1) myPort.write('r');

if(n==2) myPort.write('l');

}

}

void keyPressed()

{

if(key=='r') myPort.write('r');

if(key=='l') myPort.write('l');

}

4.2 안드로이드 프로그래밍

숫자 1씩 증가시키는 버튼과 감소시키는 버튼을 만들고, send 버튼을 누르면 와이파이(WiFi)통신을 통하여 서버로 데이터를 송신한다. 이때 서버컴퓨터(PC)의 인터넷 IP주소가 필요하다.

IP주소확인은 도스창에서 ipconfig 명령어로 살펴볼 수 있다.

다음 프로그램은 소스코드이다.

package jcs.wifi;

import java.io.DataOutputStream;

import java.io.IOException;

import java.net.Socket;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.TextView;

public class Jc_wifiActivity extends Activity {

/** Called when the activity is first created. */

Socket sock;

DataOutputStream dos;

Button up,down,send;

TextView text;

int i;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

up=(Button)findViewById(R.id.up);

down=(Button)findViewById(R.id.down);

send=(Button)findViewById(R.id.send);

text=(TextView)findViewById(R.id.text);

try {

sock=new Socket("192.168.1.107", 12345);

dos=new DataOutputStream(sock.getOutputStream());

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

up.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {

// TODO Auto-generated method stub

i++;

text.setText(String.valueOf(i));

}

});

down.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {

// TODO Auto-generated method stub

i--;

text.setText(String.valueOf(i));

}

});

send.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {

// TODO Auto-generated method stub

try {

//dos.writeUTF(String.valueOf(i));

char ch;

ch = (char)i;

dos.writeChar(ch);

//dos.writeInt(i);

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

});

}

}

다음은 버튼 만들기이다. 리소스의 layout을 수정해보자. res->layout->main.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="horizontal" >

<TextView

android:id="@+id/text"

android:layout_width="50dip"

android:layout_height="50dip"

android:text="0"

android:textSize="30dip"

/>

<Button

android:id="@+id/up"

android:layout_width="60dip"

android:layout_height="60dip"

android:text="△"

/>

<Button

android:id="@+id/down"

android:layout_width="60dip"

android:layout_height="60dip"

android:text="▽"

/>

<Button

android:id="@+id/send"

android:layout_width="60dip"

android:layout_height="60dip"

android:text="send" />

</LinearLayout>

마지막으로 인터넷에 접속을 허가해야 통신이 가능하다.

인터넷 허가를 설정하는 파일은 AndroidManifist.xml이다.

Add->User Permission->Name 콤보박스에서 permission.INTERNET을 선택 한다.

android.permission.INTERNET